
// 生成 react + ts 项目
// npx create-react-app project --template typescript


// 添加类型注解   未运行就可以捕捉到错误

// 基本类型
let str: string = "我是字符串"
let num: number = 100
let flag: boolean = false
//  null   undefined  (是所有类型的子类)
let nulls: null = null
let und: undefined = undefined

// 
let str2: string | number = 100

// 类型别名
type strAnum = string | number

let str3: strAnum = 200

// any  支持所有类型
let anys: any = "sdsd"








// 接口 (用来约定对象的类型)

interface IObj {
    // readonly  设置为只读状态
    readonly name: string,
    age: number,
    // ?  可有可无
    sex?: boolean
}

let obj2: IObj = {
    name: "李四",
    age: 30,
    sex: true
}

interface IZS {
    name: string,
    age: number
}

interface ILS {
    userName: string,
    passWord: string
}

type zsAls = IZS & ILS

let userInfo: zsAls = {
    name: "王五",
    age: 30,
    userName: 'str',
    passWord: 'pwd'
}





// 枚举  (在已知的范围内选取其中一个)

// 方法1  角标
// enum Direction {
//     up,
//     down,
//     left,
//     right
// }

// enum Direction {
//     up = "UP",
//     down = "DOWN",
//     left = "LEFT",
//     right = "RIGHT"
// }

// console.log(Direction.right)




// 数组 (每一项都是相同类型)
// 1.普通定义
// let arr: number [] = [1, 2, 3, 4]
// 2. 根据泛型的方式来定义
// let arr: Array<number> = [4, 5, 6, 7]


// 元组 ([]中有不同的类型)
// let arr2: [number, string] = [1, 'str']



// 泛型
// void  返回空
// function fn<T, N>(a: T, b: N): T {
//     return a
// }

// let nums = fn(10, 20)


// interface ILength {
//     length: number
// }

interface IPush {
    push: (arg: number) => {}
}

// 约束性泛型
function fn<T extends IPush>(arr: T) {
    // console.log(arr.length)
    arr.push(4)
    return arr
}

// let arr = [1, 2, 3]
// let nums = fn(arr)










